﻿using Hotel_Project.Bean;
using Hotel_Project.Tools.AddForm_Helps;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Hotel_Project.Tools.BrushMenuStrip
{
    /// <summary>
    /// 单例模式，获取方法对象,必须先要有,对应的类
    /// </summary>
    internal class MySqlBrushMenuStrip
    {
        private static MySqlBrushMenuStrip menuStrip = null;
        private static TabControl t;
        private MySqlBrushMenuStrip() { }   
        public static MySqlBrushMenuStrip GetMyMySqlBrushMenuStrip(TabControl ts)
        {
            t = ts;
            if (menuStrip==null)
            {
                menuStrip = new MySqlBrushMenuStrip();
            }
            return menuStrip;
        }
        public static MySqlBrushMenuStrip GetMyMySqlBrushMenuStrip()
        {
            if (menuStrip == null)
            {
                menuStrip = new MySqlBrushMenuStrip();
            }
            return menuStrip;
        }
        //刷新方法
        //程序加载加载菜单栏(直接调取这个方法)
        public void InitializeMenStrip<T>(List<T> MenuList,MenuStrip menuStrip1)
        {
            //先将标签属于的Dbelong属性为-1的拿出来，为-1的就是头节点
            foreach (T menu in MenuList.Where(t => (int)t.GetType().GetProperty("FId").GetValue(t) == -1))
            {
                //创建节点
                ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(menu.GetType().GetProperty("Text").GetValue(menu).ToString());
                //设置字体
                toolStripMenuItem.Font = new Font("微软雅黑", 16, FontStyle.Bold);
                //获取节点是否可用
                int cs = Convert.ToInt32(menu.GetType().GetProperty("Run").GetValue(menu).ToString());
                //将节点添加到menuStrip控件中
                if (cs==1)
                {
                    menuStrip1.Items.Add(toolStripMenuItem);
                    //调用添加子节点的方法
                    InitializeMenStripZi<T>(toolStripMenuItem, Convert.ToInt32(menu.GetType().GetProperty("Id").GetValue(menu)), MenuList);
                }
            }
        }
        //添加子节点方法
        private void InitializeMenStripZi<T>(ToolStripMenuItem Fu, int Rank,List<T> MenuList)
        {                                //传入的是父节点的节点    父节点的编号
            //先将头节点不要
            foreach (T item in MenuList.Where(t => (int)t.GetType().GetProperty("FId").GetValue(t) != -1))
            {
                //传入的Rank就是头节点的标号(每一个节点都有一个唯一性的编号),与子节点的属于那个父节点比较
                if (Rank == Convert.ToInt32(item.GetType().GetProperty("FId").GetValue(item).ToString()))
                {
                    //创建一个节点
                    ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(item.GetType().GetProperty("Text").GetValue(item).ToString());
                    //判定Path为不为空
                    if (item.GetType().GetProperty("FromPath").GetValue(item).ToString() != "")
                    {
                        //单击事件
                        toolStripMenuItem.Click += FormShow;
                    }
                    //绑定对象(必须绑定以便后面用到)
                    toolStripMenuItem.Tag = item;
                    //获取节点是否可用
                    int cs = Convert.ToInt32(item.GetType().GetProperty("Run").GetValue(item).ToString());
                    if (cs==1)
                    {
                        //加入到父节点中
                        Fu.DropDownItems.Add(toolStripMenuItem);
                        //递归调用找字节点下的子节点
                        InitializeMenStripZi(toolStripMenuItem, Convert.ToInt32(item.GetType().GetProperty("Id").GetValue(item)), MenuList);
                    }
                }
            }
        }
        private void FormShow(object sender, EventArgs e)
        {
            //先将sender转为ToolStripMenuItem对象，因为sender就是你控件对象
            ToolStripMenuItem obj = sender as ToolStripMenuItem;
            //在将这个obj对象转为你的标签类的对象以便拿到Path路径
            MenuStripDomain date = obj.Tag as MenuStripDomain;
            //拿到路径
            string Path = date.FromPath;
            //分割
            string[] strings = Path.Split('.');                                          //程序集            //程序集.类
            //这个方法可以放射到项目与项目之间的类实例它用法;Type type = Assembly.Load("货架管理").GetType("货架管理.GoodsShelf");
            Type type = Assembly.Load(strings[0]).GetType(Path);
            //将拿到的实例化将它转为Form类型的
            Form objs = (Form)Activator.CreateInstance(type, true);
            //调用将窗体加载到Strip中
            ControlUtils.AddTabFormPage(t, objs);
        }

        /*
         * foreach (T item in MenuList.Where(t => (int)t.GetType().GetProperty("FId").GetValue(t) != -1))
            {
                //传入的Rank就是头节点的标号(每一个节点都有一个唯一性的编号),与子节点的属于那个父节点比较
                if (Rank == Convert.ToInt32(item.GetType().GetProperty("FId").GetValue(item).ToString()))
                {
                    //创建一个节点
                    ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(item.Name);
                    //判定Path为不为空
                    if (item.Path != "")
                    {
                        //单击事件
                        toolStripMenuItem.Click += FormShow;
                    }
                    //绑定对象(必须绑定以便后面用到)
                    toolStripMenuItem.Tag = item;
                    //加入到父节点中
                    Fu.DropDownItems.Add(toolStripMenuItem);
                    //递归调用找字节点下的子节点
                    InitializeMenStripZi(toolStripMenuItem, item.Rank);
                }
            }
         * 
         * 
         * 
         * 
         */
    }
}
